package kr.co.bettersoft.waitnumbercustomer.activity;

import java.util.ArrayList;
import java.util.List;

import kr.co.bettersoft.waitnumbercustomer.adapter.EventListAdapter;
import kr.co.bettersoft.waitnumbercustomer.common.CommonConstant;
import kr.co.bettersoft.waitnumbercustomer.common.WaitNumberCustomerRest;
import kr.co.bettersoft.waitnumbercustomer.domain.MemberUser;
import kr.co.bettersoft.waitnumbercustomer.domain.WaitNumberEvent;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Typeface;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.Window;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;

import android.app.ListActivity;

import kr.co.bettersoft.waitnumbercustomer.activity.PullToRefreshListView;
import kr.co.bettersoft.waitnumbercustomer.activity.PullToRefreshListView.OnRefreshListener;


/**
 * EventListActivity
 * 이벤트 목록 액티비티.
 * 가맹점이 발송한 이벤트 목록을 확인할수 있는 화면이다.
 *  터치하면 상세화면으로 이동한다.
 * @author blue
 *
 */
public class EventListActivity extends ListActivity{
////////////////////////////////////////////////////////////////////////////////////////
// 변수 선언
	
	String TAG = "EventListActivity";
	public final int GET_MY_EVENT_LIST = 301; // 이벤트 목록 가져오는 함수

	// 폰트
	private Typeface typefaceNanumGothic= null; 
	private Typeface typefaceNanumGothicBold = null;

	
	String myQRcode = "";
	// 서버 통신 용
//	WaitNumberCustomerRest waitNumberCustomerRest;
//	String callResult = "";
//	String tempstr = "";
//	JSONObject jsonObject;
	
	// 데이터 저장
//	public List<WaitNumberEvent> entries;	// 1차적으로 조회한 결과. (상세 정보 제외)
	public List<WaitNumberEvent> dbInEntries;	// db에 넣을 거
//	public List<WaitNumberEvent> dbOutEntries;	// db에서 꺼낸거
	List<WaitNumberEvent> entriesFn = null;	
	// 받은 데이터 임시 저장용 -> 변수에 임시 저장 후 도메인에 저장
//	String tmp_idWaitingEvents = "";	// 인덱스 번호?
//	String tmp_merchantId = "";			// 등록한 가맹점 아이디
//	String tmp_companyName = "";		// 등록한 가맹점 명
//	String tmp_subject = "";			// 제목	
//	String tmp_content = "";			// 본문
//	String tmp_imageFileUrl = "";		// 이미지 URL
//	String tmp_registerDate = "";		// 등록시각

	// 화면 관련
	TextView titleBar; // 타이틀
	View emptyView;
	ListView listView;
	ProgressBar pb1;			// 진행바

	// 상단 닫기 버튼
	Button topNaviCloseBtn; 
	
	// 설정 파일 저장소  
	SharedPreferences sharedPrefCustom;
	
	Boolean dbSaveEnable = true;			// db 저장 가능 여부
	public static Boolean searched = false;		// 조회 했는가?
	int isRunning = 0;					// 중복 실행 방지
	
//	// 뒤로가기 버튼으로 닫을때 2번만에 닫히도록
//	int app_end = 0;	
//	DummyActivity dummyActivity = (DummyActivity)DummyActivity.dummyActivity;
	
	// pull down refresh
	int listIdxForPullDownRefresh;
	Boolean pullDownRefreshIng  = false;
	
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 모바일 DB 관련
	
	/*
	 * 모바일 sqlite 를 사용하여 내 이벤트 목록을 받아와서 저장. 
	 * 이후 통신 불가일때 마지막으로 저장한 데이터를 보여준다.
	 * 
	 * 통신 실패시 알림창을 띄워준다.
	 * 통신 성공시 이전 db 테이블을 지우고 새로 테이블을 만들어서 데이터를 넣어준다.
	 * 
	 * 통신 성공 여부와 상관없이 db 테이블이 있고 데이터가 있으면 해당 데이터를 보여준다.
	 */
	////----------------------- SQLite  Query-----------------------//

	// 테이블 삭제 쿼리 
	private static final String Q_INIT_TABLE = "DELETE FROM event_notice_info;" ;

	// 테이블 생성 쿼리.
	private static final String Q_CREATE_TABLE = "CREATE TABLE event_notice_info (" +
	"_id INTEGER PRIMARY KEY AUTOINCREMENT," +					// 모바일 db 저장되는 자동증가  인덱스 키
	"idWaitingEvents TEXT," +								// 인덱스 번호?
	"merchantId TEXT," +											// 등록한 가맹점 아이디
	"companyName TEXT," +											// 등록한 가맹점 명
	"subject TEXT," +					// 제목	
	"content TEXT," +					// 본문
	"imageFileUrl TEXT," +										// 이미지 URL
	"registerDate TEXT" +										// 등록시각
	");" ;
	
	// 테이블 조회 쿼리
	private final String Q_GET_LIST = "SELECT * FROM event_notice_info";
	
	//----------------------- SQLite -----------------------//

	// 초기화작업- db 및 테이블 검사하고 없으면 만들기.
	SQLiteDatabase db = null;
	/**
	 * initDB
	 *  db 초기화한다, 없으면 생성한다
	 *
	 * @param 
	 * @param
	 * @return 
	 */
	public void initDB(){
		Log.i(TAG,"initDB");
		// db 관련 작업 초기화, DB 열어 SQLiteDatabase 인스턴스 생성          db 열거나 없으면 생성
		if(db== null ){
			db= openOrCreateDatabase( "sqliteWaitNumDB.db", SQLiteDatabase.CREATE_IF_NECESSARY ,null );
		}
		// 테이블에서 데이터 가져오기 전 테이블 생성 확인 없으면 생성.
		checkTableIsCreated(db);		// sqliteWaitNumDB.db
	}

	/**
	 * checkTableIsCreated
	 *  db 확인하여 없으면 생성한다
	 *
	 * @param db
	 * @param
	 * @return
	 */
	public void checkTableIsCreated(SQLiteDatabase db){		// mileage_info 라는 이름의 테이블을 검색하고 없으면 생성.
		Log.i(TAG, "checkTableIsCreated");
		try{
			Cursor c = db.query("sqlite_master" , new String[] {"count(*)"}, "name=?" , new String[] {"event_notice_info"}, null ,null , null);
			Integer cnt=0;
			c.moveToFirst();                                 // 커서를 첫라인으로 옮김
			while(c.isAfterLast()== false ){                   // 마지막 라인이 될때까지 1씩 증가하면서 본다
				cnt=c.getInt(0);
				c.moveToNext();
			}
			//커서는 사용 직후 닫는다
			c.close();
			//테이블 없으면 생성
			if(cnt==0){
				db.execSQL(Q_CREATE_TABLE);
			}
		}catch(Exception e){
			e.printStackTrace();
		}
	}
	
	// server에서 받은 data를 db로
	/**
	 * saveEventListDataToDB
	 * server에서 받은 data를 db로 저장한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void saveEventListDataToDB(){			//	db 테이블을 초기화 후 새 데이터를 넣습니다.	  
		Log.i(TAG, "saveEventListDataToDB");
		try{
			if(db==null){
				db= openOrCreateDatabase( "sqliteWaitNumDB.db", SQLiteDatabase.CREATE_IF_NECESSARY ,null );
			}
			if(!(db.isOpen())){
				Log.i(TAG, "db is not open.. open db");
				db= openOrCreateDatabase( "sqliteWaitNumDB.db", SQLiteDatabase.CREATE_IF_NECESSARY ,null );
			}

			db.execSQL(Q_INIT_TABLE);
			ContentValues initialValues = null;
			int entrySize = dbInEntries.size();
			if(entrySize>0){
				for(int i =0; i<entrySize; i++){
					initialValues = new ContentValues(); 			
					
					initialValues.put("idWaitingEvents", dbInEntries.get(i).getIdWaitingEvents()); 
					initialValues.put("merchantId", dbInEntries.get(i).getMerchantId()); 
					initialValues.put("companyName", dbInEntries.get(i).getCompanyName()); 
					initialValues.put("subject", dbInEntries.get(i).getSubject()); 
					initialValues.put("content", dbInEntries.get(i).getContent()); 
					initialValues.put("imageFileUrl", dbInEntries.get(i).getImageFileUrl()); 
					initialValues.put("registerDate", dbInEntries.get(i).getRegisterDate()); 

					db.insert("event_notice_info", null, initialValues); 
				}
			}
			Log.i(TAG, "saveDataToDB success");

		}catch(Exception e){e.printStackTrace();}
	}
	

	// db 에 저장된 데이터를 화면에
	/**
	 * getEventDBDataList
	 * db 에 저장된 데이터를 화면에 보여주기 위해 꺼낸다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void getEventDBDataList(){
		Log.i(TAG, "getEventDBDataList");
		if(!db.isOpen()){
			Log.d(TAG,"getEventDBDataList -> db is closed. need to open");
			db= openOrCreateDatabase( "sqliteWaitNumDB.db", SQLiteDatabase.CREATE_IF_NECESSARY ,null );
		}

		String tmp_idWaitingEvents = "";	// 인덱스 번호?
		String tmp_merchantId = "";			// 등록한 가맹점 아이디
		String tmp_companyName = "";		// 등록한 가맹점 명
		String tmp_subject = "";			// 제목	
		String tmp_content = "";			// 본문
		String tmp_imageFileUrl = "";		// 이미지 URL
		String tmp_registerDate = "";		// 등록시각
		
		try{
			// 조회
			Cursor c = db.rawQuery( Q_GET_LIST, null );
			List<WaitNumberEvent> dbOutEntries = null;
			if(c.getCount()==0){
				Log.i(TAG, "saved notice data NotExist");
			}else{
				Log.i(TAG, "saved notice data Exist");				// 데이터 있으면 꺼내서 사용함.			// 데이터 꺼낼때
//				public List<WaitNumberEvent> dbOutEntries;
				dbOutEntries = new ArrayList<WaitNumberEvent>(c.getCount());		// 개수만큼 생성하기.
				c.moveToFirst();                                 // 커서를 첫라인으로 옮김
				while(c.isAfterLast()== false ){                   // 마지막 라인이 될때까지 1씩 증가하면서 본다
					tmp_idWaitingEvents = c.getString(1);	
					tmp_merchantId = c.getString(2);	
					tmp_companyName = c.getString(3);	
					tmp_subject = c.getString(4);	
					tmp_content = c.getString(5);	
					tmp_imageFileUrl = c.getString(6);	
					tmp_registerDate = c.getString(7);	
					
					dbOutEntries.add(new WaitNumberEvent(tmp_idWaitingEvents,
							tmp_merchantId,
							tmp_companyName,
							tmp_subject,
							tmp_content,
							tmp_imageFileUrl,
							tmp_registerDate
					));
					c.moveToNext();
				}
			}
			c.close();
			db.close();
			entriesFn = dbOutEntries;						//  꺼낸 데이터를 결과 데이터에 세팅 
		}catch(Exception e){e.printStackTrace();}
		showEventList();									//   결과 데이터를 화면에 보여준다.		 데이터 있는지 여부는 결과 처리에서 함께..
	}
	
	////---------------------SQLite ----------------------////
	
	
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 핸들러 및 중간에 필요한 메소드
	
	// 핸들러
	Handler handler = new Handler(){
		@Override
		public void handleMessage(Message msg){
			Bundle b = msg.getData();
			try{
				if(b.getInt("showYN")==1){		// 받아온 마일리지 결과를 화면에 뿌려준다.
					// 최종 결과 배열은 entriesFn 에 저장되어 있다 
					if(entriesFn!=null && entriesFn.size()>0){
						setListing();
						getListView().setVisibility(View.VISIBLE);
						emptyView.setVisibility(View.GONE);
					}else{
						Log.d(TAG,"no data");
						getListView().setEmptyView(emptyView);
						getListView().setVisibility(View.GONE);
						emptyView.setVisibility(View.VISIBLE);
					}
					isRunning = isRunning -1;
					// asdfasdf
				}
				if(b.getInt("order")==1){
					// 러닝바 실행
					if(pb1==null){
						pb1=(ProgressBar) findViewById(R.id.event_list_ProgressBar01);
					}
					pb1.setVisibility(View.VISIBLE);
				}else if(b.getInt("order")==2){
					// 러닝바 종료
					if(pb1==null){
						pb1=(ProgressBar) findViewById(R.id.event_list_ProgressBar01);
					}
					pb1.setVisibility(View.INVISIBLE);
				}
				if(b.getInt("showErrToast")==1){		// 일반 에러 토스트
					Toast.makeText(EventListActivity.this, R.string.error_message, Toast.LENGTH_SHORT).show();
				}
				if(b.getInt("showNetErrToast")==1){		// 네트워크 에러 토스트
					Toast.makeText(EventListActivity.this, R.string.network_error, Toast.LENGTH_SHORT).show();
				}
				
				switch (msg.what)
				{
					case GET_MY_EVENT_LIST  : runOnUiThread(new RunnableGetMyEventList());
						break;
					default : 
						break;
				}

				
			}catch(Exception e){
				e.printStackTrace();
			}
		}
	};

	// 조회한 데이터를 화면에+ 클릭시 이벤트(상세화면으로)
	/**
	 * setListing
	 *  조회한 데이터를 화면에출력하고 클릭시 상세화면으로 이동하도록 이벤트를 등록한다
	 *
	 *	pull down list 버전으로 교체
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void setListing(){
		
		getListView().setAdapter(new EventListAdapter(this, entriesFn));
		getListView().setOnItemClickListener(new OnItemClickListener() {
			public void onItemClick(AdapterView<?> parent, View v,
					int position, long id) {
				// 이벤트 상세 화면으로 데이터 전달.

				// 리스트 뷰 상단에 pull down refresh 영역 있는지 여부에 따라 결정.
				if(getListView().getCount()==entriesFn.size()){	// 상단에 아무것도 없으므로 그냥 사용
					listIdxForPullDownRefresh = position;
				}else{
					listIdxForPullDownRefresh = position-1;		// 상단에 pull down refresh 영역 한칸 차지하고 있으므로 한칸 빼줌.
				}
				Intent intent = new Intent(EventListActivity.this, EventDetailActivity.class);
				intent.putExtra("idWaitingEvents", entriesFn.get(listIdxForPullDownRefresh).getIdWaitingEvents());		// 이벤트 아이디
				intent.putExtra("merchantId", entriesFn.get(listIdxForPullDownRefresh).getMerchantId());			// 가맹점 아이디
				intent.putExtra("companyName", entriesFn.get(listIdxForPullDownRefresh).getCompanyName());		// 가맹점명
				intent.putExtra("subject", entriesFn.get(listIdxForPullDownRefresh).getSubject());			// 이벤트 제목
				intent.putExtra("content", entriesFn.get(listIdxForPullDownRefresh).getContent());			// 이벤트 본문
				intent.putExtra("imageFileUrl", entriesFn.get(listIdxForPullDownRefresh).getImageFileUrl());		// 이미지 주소
				intent.putExtra("registerDate", entriesFn.get(listIdxForPullDownRefresh).getRegisterDate());		// 이벤트 등록일
				startActivity(intent);
			}
		});
	}
	
	// entries3 를 전역에 저장후 스레드 이용하여 돌린다. 화면에 보여준다.		-- 2차 처리.
	/**
	 * showEventList
	 *  결과 도메인을 핸들러를 통해 화면에 보여준다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void showEventList(){
		hidePb();
		//  가져온 데이터 화면에 보여주기.
		EventListActivity.this.runOnUiThread(new Runnable(){		 
			@Override
			public void run(){
				Message message = handler.obtainMessage();
				Bundle b = new Bundle();
				b.putInt("showYN", 1);
				message.setData(b);
				handler.sendMessage(message);
			}
		});
	}

	public void alertToUser(){				// 	data 조회가 잘 안됐어요 
		Log.d(TAG,"Get Data from Server -> Error Occured..");
	}
	
///////////////////////////////////////////////////////////////////////////////////////////////////////
// onCreate함수
	@Override
    public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		requestWindowFeature( Window.FEATURE_NO_TITLE );		// no title
		setContentView(R.layout.event_list_activity);
		
		titleBar = (TextView) findViewById(R.id.title_bar);
		listView  = (ListView)findViewById(R.id.event_list_listview);
		emptyView = findViewById(R.id.event_list_empty2);
		pb1 = (ProgressBar) findViewById(R.id.event_list_ProgressBar01);
		
		topNaviCloseBtn = (Button) findViewById(R.id.top_navi_close_btn);
		// 상단 닫기 버튼
		topNaviCloseBtn.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				finish();
			}
		});
		
		// 폰트 지정.
	    typefaceNanumGothic = Typeface.createFromAsset(getAssets(), CommonConstant.NanumGothic);  
	    typefaceNanumGothicBold = Typeface.createFromAsset(getAssets(), CommonConstant.NanumGothicBold);
	    titleBar.setTypeface(typefaceNanumGothic); // 폰트 적용
		
//	    WaitNumberCustomerRest waitNumberCustomerRest = new WaitNumberCustomerRest();
		
		// prefs
		sharedPrefCustom = getSharedPreferences(CommonConstant.prefName,
				Context.MODE_WORLD_READABLE | Context.MODE_WORLD_WRITEABLE);
		
		myQRcode = sharedPrefCustom.getString("qrCode", "");	
		Log.i(TAG, myQRcode);		

		searched = false;		
		
		// DB 쓸거니까 초기화 해준다.
		initDB();
		
		////////////////////////////////  pull down list
		// Set a listener to be invoked when the list should be refreshed.
        ((PullToRefreshListView) getListView()).setOnRefreshListener(new OnRefreshListener() {
            @Override
            public void onRefresh() {
                // Do work to refresh the list here.
            	if(isRunning<1){								// 중복 실행 방지
        			isRunning = isRunning+1;
                        try {
                        	pullDownRefreshIng = true;				// 기본 로딩바는 보여주지 않기 위함
                        	new GetDataTask().execute();	 
            			}catch (Exception e) {
            				e.printStackTrace();
            			} 
        		}else{
        			Log.w(TAG, "already running..");
        			((PullToRefreshListView) getListView()).onRefreshComplete();
        		}
                
            }
        });
        
        
        // onresume 에서 oncreate 로 이동. 한번만 실행되도록. 이후로는 메뉴 새로고침 또는 밀어서 새로고침
        if(isRunning<1){								// 중복 실행 방지
			isRunning = isRunning+1;
			// 이벤트 리스트 조회
			handler.sendEmptyMessage(GET_MY_EVENT_LIST);
		}else{
			Log.w(TAG, "already running..");
		}
	}
	
//////////////////////////////////////////////////////////////////////////////////////////////////////
// pull down list
	
	private class GetDataTask extends AsyncTask<Void, Void, String[]> {

        @Override
        protected String[] doInBackground(Void... params) {
            // Simulates a background job.
        	
        	/*
        	 * 방법 1. 다른애 시키고 끝낸다. 상단 로딩바가 끝나고 일반 로딩처럼 화면 중앙 로딩바가 새로 생김
        	 */
//        	handler.sendEmptyMessage(GET_MY_EVENT_LIST);
  
        	/*
        	 * 방법 2. 직접 돌린다. 위에서 할일을 모두 옮김. 처리 되는 동안 상단 로딩바가 계속 나타날 것임
        	 */
        	Log.d(TAG,"GetDataTask");
			
			// 파라미터 세팅
			MemberUser memberUserParam = new MemberUser();
			memberUserParam.setQrCode(myQRcode);
			
			// 서버 메소드 호출
//			if(!pullDownRefreshIng){		// 자체 로딩바로 대체됨
//				showPb();
//			}
			WaitNumberCustomerRest waitNumberCustomerRest = new WaitNumberCustomerRest();
			String callResult  = waitNumberCustomerRest.RestGetMyEventList(memberUserParam);
			// 결과 처리
			if(!(callResult.equals("F"))){			
				processEventListData(callResult);
			}else{
				// 데이터 가져오는데 실패하면 ㅡ DB에 저장된 것을 사용한다.
				hidePb();
				isRunning = isRunning-1;
				getEventDBDataList();
			}
			
            return null;
        }
        @Override
        protected void onPostExecute(String[] result) {
            // Call onRefreshComplete when the list has been refreshed.
        	pullDownRefreshIng = false;							// 기본 로딩바 보여주기 상태 초기화. resume 기능으로는 보여지도록.
            ((PullToRefreshListView) getListView()).onRefreshComplete();		// 리프레시  끝 
            super.onPostExecute(result);
        }
    }

	
///////////////////////////////////////////////////////////////////////////////////////////////////////	
	
	
	
	/**
	 * 러너블. 이벤트 목록 가져오는 함수
	 */
	class RunnableGetMyEventList implements Runnable {
		public void run(){
			new backgroundThreadGetMyEventList().execute();
		}
	}
	/**
	 * backgroundThreadGetMyEventList
	 * 비동기  .   이벤트 목록 가져오는 함수
	 * @author blue
	 *
	 */
	public class backgroundThreadGetMyEventList extends AsyncTask<Void, Void, Void>{
		@Override protected void onPostExecute(Void result) {  
		} 
		@Override protected void onPreExecute() {  
		} 
		@Override protected Void doInBackground(Void... params) {  
			Log.d(TAG,"backgroundThreadGetMyEventList");
			
			// 파라미터 세팅
			MemberUser memberUserParam = new MemberUser();
			memberUserParam.setQrCode(myQRcode);
			
			// 서버 메소드 호출
			if(!pullDownRefreshIng){
				showPb();
			}
			WaitNumberCustomerRest waitNumberCustomerRest = new WaitNumberCustomerRest();
			String callResult  = waitNumberCustomerRest.RestGetMyEventList(memberUserParam);
			// 결과 처리
			if(!(callResult.equals("F"))){			
				processEventListData(callResult);
			}else{
				// 데이터 가져오는데 실패하면 ㅡ DB에 저장된 것을 사용한다.
				hidePb();
				isRunning = isRunning-1;
				getEventDBDataList();
			}
			return null; 
		}
	}
	
	
////////////////////////////////////////////////////////////////////////////////////////////////////////////	
	
	/**
	 * 서버에서 받아온 이벤트 리스트 정보를 파싱하여 화면에 뿌려준다.
	 */
	public void processEventListData(String callResult){
		JSONArray jsonArray2 = null;
		try {
			jsonArray2 = new JSONArray(callResult);
		} catch (JSONException e1) {
			e1.printStackTrace();
		}

		int max = jsonArray2.length();
		try {
			dbInEntries = new ArrayList<WaitNumberEvent>(max);

			// 날짜 형식 변환해서 저장하기 용도
			String tmp_registerDate = "";
			int dayOfRegisterDate = 0;	// 오전 오후 분간용
			String dayOfRegisterDateStr = "";	// 다시 문자형 시간으로 변환해서 저장(2자리 유지하기 위함)
			String strAMPM = "";
			String tmp_registerDate2 = "";	// 형식 변환해서 저장용

			// 받은 데이터 임시 저장용 -> 변수에 임시 저장 후 도메인에 저장
			String tmp_idWaitingEvents = "";	// 인덱스 번호?
			String tmp_merchantId = "";			// 등록한 가맹점 아이디
			String tmp_companyName = "";		// 등록한 가맹점 명
			String tmp_subject = "";			// 제목	
			String tmp_content = "";			// 본문
			String tmp_imageFileUrl = "";		// 이미지 URL
//			String tmp_registerDate = "";		// 등록시각
			if(max>0){
				for ( int i = 0; i < max; i++ ){
					JSONObject jsonObj = jsonArray2.getJSONObject(i);

					try{
						tmp_idWaitingEvents = jsonObj.getString("idWaitingEvents");
					}catch(Exception e){
						tmp_idWaitingEvents = "";
					}
					try{
						tmp_merchantId = jsonObj.getString("merchantId");
					}catch(Exception e){
						tmp_merchantId = "";
					}
					try{
						tmp_companyName = jsonObj.getString("companyName");
					}catch(Exception e){
						tmp_companyName = "";
					}
					try{
						tmp_subject = jsonObj.getString("subject");
					}catch(Exception e){
						tmp_subject = "";
					}
					try{
						tmp_content = jsonObj.getString("content");
					}catch(Exception e){
						tmp_content = "";
					}
					try{
						tmp_imageFileUrl = jsonObj.getString("imageFileUrl");
					}catch(Exception e){
						tmp_imageFileUrl = "";
					}
					try{
						tmp_registerDate = jsonObj.getString("registerDate");

						// 길면 자르기
						if(tmp_registerDate!=null &&(tmp_registerDate.length()>19)){
							tmp_registerDate = tmp_registerDate.substring(0, 19);		// 2013-05-15 15:21:25  -> 초까지 나옴
						}
						// 오전 오후 분간하기
						dayOfRegisterDate = Integer.parseInt(tmp_registerDate.substring(11, 13));	// dayOfRegisterDate
						if(dayOfRegisterDate>11){		// 12시 넘었을때 = 오후
							dayOfRegisterDate = dayOfRegisterDate - 12;
							strAMPM = getString(R.string.pm)+"";
						}else{				// 12시 이전 = 오전
							strAMPM = getString(R.string.am)+"";
						}
						// 두자리로 맞추기.
						dayOfRegisterDateStr = Integer.toString(dayOfRegisterDate);
						if(dayOfRegisterDate<10){		
							dayOfRegisterDateStr = "0"+dayOfRegisterDateStr;
						}
						// 원하는 날짜 형식에 맞춰서 데이터 넣기
						tmp_registerDate2 = 
							tmp_registerDate.substring(0, 4)+getString(R.string.year) 
							+tmp_registerDate.substring(5, 7) + getString(R.string.month) 
							+tmp_registerDate.substring(8, 10) + getString(R.string.day) 
							+ " " + strAMPM + " " 
							+dayOfRegisterDateStr + getString(R.string.hour) 
							+tmp_registerDate.substring(14, 16) + getString(R.string.minute) 
							+tmp_registerDate.substring(17, 19) + getString(R.string.seconds);
//							+tmp_registerDate.substring(13);
						tmp_registerDate = tmp_registerDate2;	
					}catch(Exception e){
						tmp_registerDate = "";
					}

					dbInEntries.add(new WaitNumberEvent(
							tmp_idWaitingEvents,  
							tmp_merchantId,
							tmp_companyName,
							tmp_subject,
							tmp_content,
							tmp_imageFileUrl,
							tmp_registerDate
					));
				}
			}
		}catch (JSONException e) {
			dbSaveEnable = false;
			e.printStackTrace();
		}
//		dbInEntries = entries; 
		searched = true;
		// db 에 데이터를 넣는다.
		try{
			if(dbSaveEnable){		// 이미지까지 성공적으로 가져온 경우.
				saveEventListDataToDB();
			}else{
				alertToUser();		// 이미지 가져오는데 실패한 경우.
				// 어쨎든 처리가 끝나면 (공통) -  db를 검사하여 데이터가 있으면 보여주고  entriesFn = dbOutEntries
			}	// 처리가 끝나면 공통으로 해야할 showInfo(); (그전에 entriesFn 설정 한다)
		}catch(Exception e){}
		getEventDBDataList();			//db 에 잇으면 그거 쓰고 없으면 없다고 알림. * 에러나면 이전 데이터를 보여주기 때문에 db에 있는 정보가 정확하다고 볼수는 없음.. 
		hidePb();
		isRunning = isRunning-1;
	}
	
	
	
///////////////////////////////////////////////////////////////////////////////////////////////////////	


	
///////////////////////////////////////////////////////////////////////////////////////////////////////
	////////////////////////   하드웨어 메뉴 버튼.  ////////////////

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		String tmpstr = getString(R.string.refresh);		
		menu.add(Menu. NONE, Menu.FIRST+1, Menu.NONE, tmpstr );             // 신규등록 메뉴 추가. -- 새로고침
		return (super .onCreateOptionsMenu(menu));
	}
	// 옵션 메뉴 특정 아이템 클릭시 필요한 일 처리
	@Override
	public boolean onOptionsItemSelected(MenuItem item){
		return (itemCallback(item)|| super.onOptionsItemSelected(item));
	}
	// 아이템 아이디 값 기준 필요한 일 처리
	public boolean itemCallback(MenuItem item){
		switch(item.getItemId()){
		case Menu. FIRST+1:
			if(isRunning<1){					// 조회중확인
				isRunning = isRunning+1;
				// 조회 한다--> 새로고침 기능 이 된다
				handler.sendEmptyMessage(GET_MY_EVENT_LIST);
			}else{
				Log.w(TAG, "already running..");
			}
			return true ;
		}
		return false;
	}
///////////////////////////////////////////////////////////////////////////////////////////////////////
// Utils
	
	/**
	 * returnThis
	 *  컨택스트를 리턴한다.(핸들러에서 필요)
	 *
	 * @param
	 * @param
	 * @return
	 */
	public Context returnThis(){
		return this;
	}

	// 진행창 보이기/숨기기
	/**
	 * showPb
	 *  중앙 프로그래스바 가시화한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void showPb(){
		EventListActivity.this.runOnUiThread(new Runnable(){		 
			@Override
			public void run(){
				Message message = handler.obtainMessage();
				Bundle b = new Bundle();
				b.putInt("order", 1);
				message.setData(b);
				handler.sendMessage(message);
			}
		});
	}
	/**
	 * hidePb
	 *  중앙 프로그래스바 비가시화한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void hidePb(){
		EventListActivity.this.runOnUiThread(new Runnable(){		 
			@Override
			public void run(){
				Message message = handler.obtainMessage();
				Bundle b = new Bundle();
				b.putInt("order", 2);
				message.setData(b);
				handler.sendMessage(message);
			}
		});
	}

	/**
	 * showMSG
	 *  화면에 error 토스트 띄운다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void showMSG(){			// 화면에 토스트 띄움..
		EventListActivity.this.runOnUiThread(new Runnable(){		 
			@Override
			public void run(){
				Message message = handler.obtainMessage();				
				Bundle b = new Bundle();
				b.putInt("showErrToast", 1);
				message.setData(b);
				handler.sendMessage(message);
			}
		});
	}
	
//	/*
//	 *  닫기 버튼 2번 누르면 종료 됨.(non-Javadoc)
//	 * @see android.app.Activity#onBackPressed()
//	 */
//	/**
//	 * onBackPressed
//	 *   닫기 버튼 2번 누르면 종료 한다
//	 *
//	 * @param
//	 * @param
//	 * @return
//	 */
//	@Override
//	public void onBackPressed() {
//		Log.d(TAG, "EventListActivity finish");		
//		if(app_end == 1){
//			Log.d(TAG,"kill all");
//			dummyActivity.finish();			// 더미도 종료
//			DummyActivity.count = 0;		// 개수 0으로 초기화 시켜준다. 다시 실행될수 있도록
//			finish();
//		}else{
//			app_end = 1;
//			Toast.makeText(EventListActivity.this, R.string.noti_back_finish, Toast.LENGTH_SHORT).show();
//			new Thread( 
//					new Runnable(){
//						public void run(){
//							try {
//								Thread.sleep(3000);
//								app_end = 0;
//							} catch (InterruptedException e) {e.printStackTrace();}
//						}
//					}
//			).start();
//		}
//	}
	@Override
	public void onResume(){
		super.onResume();
//		app_end = 0;
		
	}
	
	@Override
	public void onDestroy(){
		db.close();			//사용이 끝났으니 db 는 닫아준다
		super.onDestroy();
	}
	
}


